package com.bzkj.common.utils;

import com.bzkj.common.core.domain.AjaxResult;
import com.bzkj.common.core.redis.RedisCache;
import com.bzkj.common.core.text.Convert;
import com.bzkj.common.constant.BillStatusConstant;
import com.bzkj.common.enums.BusinessType;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @projectName: prt-wms
 * @package: com.bzkj.document.utils.common
 * @className: MessageUtil
 * @description: 提示信息工具类
 * @author: C1309
 * @createDate: 2025年01月03日
 * @version: v1.0
 */

@Component
public class MessageUtil {

    @Resource
    private RedisCache redisCache;


    /**
     * 生成提示信息:{billType}{info}
     *
     * @param template       模版：{billType}{info}
     * @param billType       单据类型
     * @param additionalInfo 提示信息
     * @return 提示信息
     */
    public String generateMessage(String template, String billType, String additionalInfo) {
        return template.replace("{billType}", billType).replace("{info}", additionalInfo);
    }

    /**
     * 生成提示信息:小提示：{billType}单据{info}
     *
     * @param billType       单据类型
     * @param additionalInfo 提示信息
     * @return 提示信息
     */
    public String generateWarningMessage(String billType, String additionalInfo) {
        return generateMessage("小提示：{billType}单据{info}", billType, additionalInfo);
    }

    /**
     * 生成提示信息:小提示：{billType}{info}
     *
     * @param billType       单据类型
     * @param additionalInfo 提示信息
     * @return 提示信息
     */
    public String generateErrorMessage(String billType, String additionalInfo) {
        return generateMessage("小提示：{billType}{info}", billType, additionalInfo);
    }

    /**
     * 更新单据提示信息
     *
     * @param billStatus 单据状态
     * @param billType   单据类型
     * @return 提示信息
     */
    public AjaxResult updateBillMessage(String billStatus, String billType) {

        // 获取默认消息模式
        String mode = Convert.toStr(redisCache.getCacheObject("sys_config:sys.message.type"));

        Map<String, Map<String, String>> modeMessages = new HashMap<>();

        // 标准风格
        Map<String, String> standardMessages = new HashMap<>();
        standardMessages.put(BillStatusConstant.OPERATED, "提示：%s已被PDA提取，请前往PDA完成后续操作。");
        standardMessages.put(BillStatusConstant.SIGNED, "提示：%s已完成签字，无法进行修改操作。");
        standardMessages.put(BillStatusConstant.DELETED, "提示：%s已被作废，无法进行修改操作。");
        standardMessages.put(BillStatusConstant.FINISHED, "提示：%s已完成签字前的所有操作，暂时无法修改。");
        standardMessages.put(BillStatusConstant.INSPECTION, "提示：%s已发起请验。无法进行修改操作。");
        standardMessages.put(BillStatusConstant.INSPECTION_FINISHED, "提示：%s请验完成，无法进行修改操作。");

        // 幽默风格
        Map<String, String> humorousMessages = new HashMap<>();
        humorousMessages.put(BillStatusConstant.OPERATED, "嘿！%s已经被PDA提走了，它说想换个地方待会儿，快去找它吧！");
        humorousMessages.put(BillStatusConstant.SIGNED, "哇，%s已经签字完成了，看来它比你还靠谱！");
        humorousMessages.put(BillStatusConstant.DELETED, "呃，%s已经被作废掉了，放心，它不会再跑出来吓你了！");
        humorousMessages.put(BillStatusConstant.FINISHED, "喂！%s已经完成签字前的所有流程了，不能修改啦！别急，它现在比你还安全呢！");
        humorousMessages.put(BillStatusConstant.INSPECTION, "喂！%s已经提交请验申请啦！现在系统已锁定，无法修改咯~ 别担心，数据比保险箱还安全呢！");
        humorousMessages.put(BillStatusConstant.INSPECTION_FINISHED, "叮！%s的请验流程已完美收官，数据已锁定存档啦~ 现在稳如泰山，改不了咯！");

        // 将所有风格的消息放入 modeMessages 中
        modeMessages.put("standard", standardMessages);
        modeMessages.put("humorous", humorousMessages);


        // 根据模式选择提示语
        Map<String, String> messages = modeMessages.getOrDefault(mode, standardMessages);

        // 特殊处理完成状态
        if (BillStatusConstant.NOT_OPERATED.equals(billStatus)) {
            return AjaxResult.success();
        }

        // 根据单据状态生成提示
        String messageTemplate = messages.get(billStatus);
        if (messageTemplate != null) {
            String message = String.format(messageTemplate, billType);
            return AjaxResult.warn(message);
        }

        // 默认处理未知状态
        return AjaxResult.error("提示：未知的单据状态，请检查单据状态！");
    }


    /**
     * 单据签字提示信息
     *
     * @param billStatus 单据状态
     * @param billType   单据类型
     * @return 提示信息
     */
    public AjaxResult signedBillMessage(String billStatus, String billType) {
        // 获取默认消息模式
        String mode = Convert.toStr(redisCache.getCacheObject("sys_config:sys.message.type"));

        // 定义多种模式的提示语映射表
        Map<String, Map<String, String>> modeMessages = new HashMap<>();

        // 标准模式
        Map<String, String> standardMessages = new HashMap<>();
        standardMessages.put(BillStatusConstant.OPERATED, "提示：%s已经被PDA提取，请前往PDA完成操作！");
        standardMessages.put(BillStatusConstant.SIGNED, "提示：%s已经完成签字，无需再次操作！");
        standardMessages.put(BillStatusConstant.DELETED, "提示：%s已经被作废，无法签字，请确认！");
        standardMessages.put(BillStatusConstant.NOT_OPERATED, "提示：%s尚未开始进行操作，暂时无法签字，请先确认！");
        standardMessages.put(BillStatusConstant.INSPECTION, "提示：%s已发起请验，无法进行签字操作！");
        standardMessages.put(BillStatusConstant.INSPECTION_FINISHED, "提示：%s请验完成，无法进行签字操作！");

        // 幽默风格
        Map<String, String> humorousMessages = new HashMap<>();
        humorousMessages.put(BillStatusConstant.OPERATED, "嘿！%s已经被PDA提走了~ 它说想换个地方待会儿，快去PDA看看吧！");
        humorousMessages.put(BillStatusConstant.SIGNED, "哎呀，%s已经签字完成了，不能再签字啦！看来它比你还靠谱！");
        humorousMessages.put(BillStatusConstant.DELETED, "呃，%s已经被作废掉了，别担心，它不会再跑出来捣乱了！");
        humorousMessages.put(BillStatusConstant.NOT_OPERATED, "嘿，%s还没开始进行操作！它可能在某个环节迷路了，快去找找吧！");
        humorousMessages.put(BillStatusConstant.INSPECTION, "提醒：%s 的签字流程已经先走完啦！现在请验流程已启动，暂时不能补签咯~ 下次记得流程顺序哦！");
        humorousMessages.put(BillStatusConstant.INSPECTION_FINISHED, "叮咚！%s的请验报告已新鲜出炉啦~ 签字通道已关闭，下次要赶在验货前挥毫哦！");

        // 添加不同模式的提示信息
        modeMessages.put("standard", standardMessages);
        modeMessages.put("humorous", humorousMessages);

        // 根据模式选择提示语
        Map<String, String> messages = modeMessages.getOrDefault(mode, standardMessages);

        // 特殊处理完成状态
        if (BillStatusConstant.FINISHED.equals(billStatus)) {
            return AjaxResult.success();
        }

        // 根据单据状态生成提示
        String messageTemplate = messages.get(billStatus);
        if (messageTemplate != null) {
            String message = String.format(messageTemplate, billType);
            return AjaxResult.warn(message);
        }

        // 默认处理未知状态
        return AjaxResult.error("提示：未知的单据状态，请检查单据状态！");
    }


    /**
     * 作废单据提示信息
     *
     * @param billStatus 单据状态
     * @param billType   单据类型
     * @return 提示信息
     */
    public AjaxResult deleteBillMessage(String billStatus, String billType) {

        // 获取默认消息模式
        String mode = Convert.toStr(redisCache.getCacheObject("sys_config:sys.message.type"));

        // 定义提示信息模板映射表，按模式区分
        Map<String, Map<String, String>> modeMessages = new HashMap<>();

        // 标准模式提示信息
        Map<String, String> standardMessages = new HashMap<>();
        standardMessages.put(BillStatusConstant.OPERATED, "提示：%s已经被PDA提取，快去PDA上完成接下来的操作吧!");
        standardMessages.put(BillStatusConstant.SIGNED, "提示：您的%s已经完成签字，现在无法作废，请放心，操作已受控！");
        standardMessages.put(BillStatusConstant.DELETED, "提示：您的%s已经被作废，无法再次作废，请确认是否无误！");
        standardMessages.put(BillStatusConstant.FINISHED, "提示：%s已完成签字前的所有操作，暂时无法作废，请先确认！");
        standardMessages.put(BillStatusConstant.INSPECTION, "提示：%s已发起请验，暂时无法作废，请先确认！");
        standardMessages.put(BillStatusConstant.INSPECTION_FINISHED, "提示：%s请验完成，暂时无法作废，请先确认！");

        // 幽默风格
        Map<String, String> humorousMessages = new HashMap<>();
        humorousMessages.put(BillStatusConstant.OPERATED, "嘿！%s已经被PDA拐走啦~ 快去把它‘救’回来吧！");
        humorousMessages.put(BillStatusConstant.SIGNED, "哎呀，%s已经签字了，不能作废啦！它可比你还固执呢！");
        humorousMessages.put(BillStatusConstant.DELETED, "哼，%s已经被作废了，它自己都不知道还能被作废一次！");
        humorousMessages.put(BillStatusConstant.FINISHED, "喂！%s已经完成签字前的所有操作啦，暂时不能作废！别担心，它比你还安全！");
        humorousMessages.put(BillStatusConstant.INSPECTION, "注意啦~ %s的请验单已经出发去检验啦！现在暂时不能作废哦！");
        humorousMessages.put(BillStatusConstant.INSPECTION_FINISHED, "叮咚~ %s的质检小分队已经收工啦！无法作废啦！");
        // 添加不同模式的提示信息
        modeMessages.put("standard", standardMessages);
        modeMessages.put("humorous", humorousMessages);

        // 获取当前模式的提示信息
        Map<String, String> statusMessages = modeMessages.getOrDefault(mode, standardMessages);

        // 根据单据状态获取对应提示信息
        if (BillStatusConstant.NOT_OPERATED.equals(billStatus)) {
            // 未收货状态允许作废
            return AjaxResult.success();
        }

        String messageTemplate = statusMessages.get(billStatus);
        if (messageTemplate != null) {
            // 使用 billType 替换模板中的占位符
            String message = String.format(messageTemplate, billType);
            return AjaxResult.warn(message);
        }

        // 默认处理未知状态
        return AjaxResult.error("提示：未知的单据状态，请检查单据状态！");
    }

    /**
     * 取消PDA提取单据提示信息
     *
     * @param billStatus 单据状态
     * @param billType   单据类型
     * @return 提示信息
     */
    public AjaxResult cancelExtractBillMessage(String billStatus, String billType) {

        // 获取默认消息模式
        String mode = Convert.toStr(redisCache.getCacheObject("sys_config:sys.message.type"));

        Map<String, Map<String, String>> modeMessages = new HashMap<>();

        // 标准风格
        Map<String, String> standardMessages = new HashMap<>();
        standardMessages.put(BillStatusConstant.SIGNED, "提示：%s已完成签字，无法进行取消提取操作。");
        standardMessages.put(BillStatusConstant.DELETED, "提示：%s已被作废，无法进行取消提取操作。");
        standardMessages.put(BillStatusConstant.INSPECTION, "提示：%s已发起请验，无法进行取消提取操作。");
        standardMessages.put(BillStatusConstant.INSPECTION_FINISHED, "提示：%s请验完成，无法进行取消提取操作。");

        // 幽默风格
        Map<String, String> humorousMessages = new HashMap<>();
        humorousMessages.put(BillStatusConstant.SIGNED, "哇，%s已经签字完成了，看来它比你还靠谱！");
        humorousMessages.put(BillStatusConstant.DELETED, "呃，%s已经被作废掉了，放心，它不会再跑出来吓你了！");
        humorousMessages.put(BillStatusConstant.INSPECTION, "注意！%s正在质检中，取消提取功能已经休息啦~ ");
        humorousMessages.put(BillStatusConstant.INSPECTION_FINISHED, "%s质检已完成，取消提取订单已锁定~ ");
        // 将所有风格的消息放入 modeMessages 中
        modeMessages.put("standard", standardMessages);
        modeMessages.put("humorous", humorousMessages);

        ArrayList<String> billStatusList = new ArrayList<>();
        billStatusList.add(BillStatusConstant.FINISHED);
        billStatusList.add(BillStatusConstant.OPERATED);

        // 根据模式选择提示语
        Map<String, String> messages = modeMessages.getOrDefault(mode, standardMessages);

        // 特殊处理完成状态
        if (billStatusList.contains(billStatus)) {
            return AjaxResult.success();
        }

        // 根据单据状态生成提示
        String messageTemplate = messages.get(billStatus);
        if (messageTemplate != null) {
            String message = String.format(messageTemplate, billType);
            return AjaxResult.warn(message);
        }

        // 默认处理未知状态
        return AjaxResult.error("提示：未知的单据状态，请检查单据状态！");
    }


    // ==========================================================
    // 模块名称: 单据新增、作废、更新、签字、发起请验、WMS库存处理成功提醒模块
    // 功能描述: 根据不同的消息模式返回不同的提示信息
    // ==========================================================

    /**
     * 根据单据类型和消息模式生成相应的成功提示消息
     *
     * @param billCodeList  单据号列表
     * @param documentType  单据类型
     * @param operationType 操作类型
     * @return 提示消息
     */
    public String operateSuccessMessage(List<?> billCodeList, String documentType, String operationType) {
        // 获取默认消息模式
        String mode = Convert.toStr(redisCache.getCacheObject("sys_config:sys.message.type"));

        // 定义消息模式和对应的消息模板
        Map<String, String> messageTemplates = new HashMap<>();

        // 不同单据类型的模板
        String documentTemplate = getDocumentTemplate(documentType, operationType);

        // 定义不同消息模式的模板
        messageTemplates.put("standard", documentTemplate);
        messageTemplates.put("humorous", documentTemplate + "你这效率都快赶上闪电了！");

        // 获取消息模板，若不存在则返回默认消息模板
        String defaultTemplate = messageTemplates.getOrDefault(mode, messageTemplates.get("standard"));

        // 返回生成的消息
        return String.format(defaultTemplate, formatBillCodes(billCodeList));
    }

    /**
     * 获取不同单据类型的模板
     *
     * @param documentType  单据类型
     * @param operationType 操作类型
     * @return 提示语
     */
    private static String getDocumentTemplate(String documentType, String operationType) {
        Map<String, String> documentTemplates = new HashMap<>();

        // 定义不同单据类型的模板

        if (BusinessType.INVALID.getDescription().equals(operationType)) {
            documentTemplates.put("PO", "采购订单WMS单已成功" + operationType + "，请联系制单人在NCC上完成作废操作，单号为：【%s】。");
            documentTemplates.put("PI", "采购入库单WMS单已成功" + operationType + "，请联系制单人在NCC上完成作废操作，单号为：【%s】。");
            documentTemplates.put("FPI", "产成品入库单WMS单已成功" + operationType + "，请联系制单人在NCC上完成作废操作，单号为：【%s】。");
            documentTemplates.put("SO", "销售出库WMS单已成功" + operationType + "，请联系制单人在NCC上完成作废操作，单号为：【%s】。");
            documentTemplates.put("MO", "材料出库单WMS已成功" + operationType + "，请联系制单人在NCC上完成作废操作，单号为：【%s】。");
            documentTemplates.put("OO", "其他出库单WMS已成功" + operationType + "，请联系制单人在NCC上完成作废操作，单号为：【%s】。");
            documentTemplates.put("TO", "转库单WMS已成功" + operationType + "，请联系制单人在NCC上完成作废操作，单号为：【%s】。");
            documentTemplates.put("OI", "其他入库单已成功" + operationType + "请联系制单人在NCC上完成作废操作，单号为：【%s】。");
        } else {
            documentTemplates.put("PO", "采购订单已经成功" + operationType + "，单号为：【%s】。");
            documentTemplates.put("PI", "采购入库单已成功" + operationType + "，单号为：【%s】。");
            documentTemplates.put("FPI", "产成品入库单已成功" + operationType + "，单号为：【%s】。");
            documentTemplates.put("SO", "销售出库单已成功" + operationType + "，单号为：【%s】。");
            documentTemplates.put("MO", "材料出库单已成功" + operationType + "，单号为：【%s】。");
            documentTemplates.put("OO", "其他出库单已成功" + operationType + "，单号为：【%s】。");
            documentTemplates.put("TO", "转库单已成功" + operationType + "，单号为：【%s】。");
            documentTemplates.put("OI", "其他入库单已成功" + operationType + "，单号为：【%s】。");
        }
        // 根据单据类型获取对应的模板
        return documentTemplates.getOrDefault(documentType, "单据已成功" + operationType + "，单号为：【%s】。");
    }

    // ==========================================================
    // 模块名称: 未选择操作单据提醒模块
    // 功能描述: 根据不同的消息模式返回不同的提示信息
    // ==========================================================

    /**
     * 未选择相关单据提醒
     *
     * @param documentType  单据类型
     * @param operationType 操作类型
     * @return 提示消息
     */
    public String noSelectOrderMessage(String documentType, String operationType) {
        // 获取默认消息模式
        String mode = Convert.toStr(redisCache.getCacheObject("sys_config:sys.message.type"));

        // 定义消息模式和对应的消息模板
        Map<String, String> messageTemplates = new HashMap<>();


        // 不同单据类型的模板
        String documentTemplate = noSelectDocumentTemplate(documentType, operationType);

        // 定义不同消息模式的模板
        messageTemplates.put("standard", documentTemplate);
        messageTemplates.put("humorous", "快来选择吧！" + documentTemplate + "别让它等太久！");

        // 返回生成的提示消息
        return messageTemplates.getOrDefault(mode, messageTemplates.get("standard"));
    }

    /**
     * 获取不同单据类型的操作提示模板
     *
     * @param documentType  单据类型
     * @param operationType 操作类型
     * @return 提示语
     */
    private static String noSelectDocumentTemplate(String documentType, String operationType) {
        Map<String, String> documentTemplates = new HashMap<>();

        // 定义不同单据类型的模板
        documentTemplates.put("PO", "请选择需要" + operationType + "的采购订单！");
        documentTemplates.put("PI", "请选择需要" + operationType + "的采购入库单！");
        documentTemplates.put("MO", "请选择需要" + operationType + "的材料出库单！");
        documentTemplates.put("FPI", "请选择需要" + operationType + "的产成品入库单！");
        documentTemplates.put("SO", "请选择需要" + operationType + "的销售出库单！");
        documentTemplates.put("OI", "请选择需要" + operationType + "的其他入库单！");
        documentTemplates.put("OO", "请选择需要" + operationType + "的其他出库单！");
        documentTemplates.put("TO", "请选择需要" + operationType + "的转库单！");

        // 根据单据类型获取对应的模板
        return documentTemplates.getOrDefault(documentType, "请选择需要" + operationType + "的单据！");
    }

    // ==========================================================
    // 模块名称: 操作出现异常提示提醒模块
    // 功能描述: 根据不同的消息模式返回不同的提示信息
    // ==========================================================

    /**
     * 操作出现异常提示
     *
     * @param documentType  单据类型
     * @param exception     异常信息
     * @param operationType 操作类型
     * @return 提示消息
     */
    public String operateExceptionMessage(String documentType, Exception exception, String operationType) {
        // 获取默认消息模式
        String mode = Convert.toStr(redisCache.getCacheObject("sys_config:sys.message.type"));

        // 定义消息模式和对应的消息模板
        Map<String, String> messageTemplates = new HashMap<>();

        // 获取单据类型的异常提示模板
        String documentTemplate = getDocumentExceptionTemplate(documentType, operationType);

        // 定义不同消息模式的模板
        messageTemplates.put("standard", documentTemplate);
        messageTemplates.put("humorous", "系统开了个小差：" + documentTemplate + "，也许喝杯咖啡再试会好点！");

        // 获取消息模板，若不存在则返回默认消息模板
        String defaultTemplate = messageTemplates.getOrDefault(mode, messageTemplates.get("standard"));

        // 获取异常信息（如果需要显示具体异常原因）
        String exceptionDetails = exception != null ? exception.getMessage() : "未知错误，请联系技术支持进行排查！";

        // 返回生成的消息
        return String.format(defaultTemplate, exceptionDetails);
    }

    /**
     * 获取不同单据类型的异常提示模板
     *
     * @param documentType 单据类型
     * @return 异常提示语
     */
    private static String getDocumentExceptionTemplate(String documentType, String operationType) {
        Map<String, String> documentExceptionTemplates = new HashMap<>();

        // 定义不同单据类型的异常提示模板
        documentExceptionTemplates.put("PO", "系统在执行采购订单【<b>" + operationType + "】</b>操作时出现了问题，具体原因是：<br>%s");
        documentExceptionTemplates.put("MO", "系统在执行材料出库单【<b>" + operationType + "】</b>操作时出现了问题，具体原因是：<br>%s");
        documentExceptionTemplates.put("FPI", "系统在执行产成品入库单【<b>" + operationType + "】</b>操作时出现了问题，具体原因是：<br>%s");
        documentExceptionTemplates.put("SO", "系统在执行销售出库单【<b>" + operationType + "】</b>操作时出现了问题，具体原因是：<br>%s");
        documentExceptionTemplates.put("OI", "系统在执行其他入库单【<b>" + operationType + "】</b>操作时出现了问题，具体原因是：<br>%s");
        documentExceptionTemplates.put("OO", "系统在执行其他出库单【<b>" + operationType + "】</b>操作时出现了问题，具体原因是：<br>%s");
        documentExceptionTemplates.put("TO", "系统在执行转库单【<b>" + operationType + "】</b>操作时出现了问题，具体原因是：<br>%s");

        // 根据单据类型获取对应的模板
        return documentExceptionTemplates.getOrDefault(documentType, "系统在执行单据【<b>" + operationType + "</b>】操时作出现了问题，具体原因是：<br>%s");
    }

    // ==========================================================
    // 模块名称: 单据明细未完全完成提醒模块
    // 功能描述: 根据不同的消息模式返回不同的提示信息
    // ==========================================================

    /**
     * 单据未完成提示
     *
     * @param documentType
     * @return
     */
    public String updateDocumentZeroQuantityMessage(String documentType) {
        // 获取默认消息模式
        String mode = Convert.toStr(redisCache.getCacheObject("sys_config:sys.message.type"));

        // 定义消息模式和对应的消息模板
        Map<String, String> messageTemplates = new HashMap<>();

        // 获取单据类型的数量为0的提示模板
        String documentTemplate = getDocumentZeroQuantityTemplate(documentType);

        // 定义不同消息模式的模板
        messageTemplates.put("standard", documentTemplate + "请检查单据是否完成后再试。");
        messageTemplates.put("humorous", "哎呀，" + documentTemplate + "是不是忘了填数量呀？再试试吧！");

        // 返回生成的消息
        return messageTemplates.getOrDefault(mode, messageTemplates.get("standard"));
    }

    /**
     * 获取不同单据类型的数量为0的提示模板
     *
     * @param documentType 单据类型
     * @return 提示语
     */
    private static String getDocumentZeroQuantityTemplate(String documentType) {
        Map<String, String> documentZeroQuantityTemplates = new HashMap<>();

        // 定义不同单据类型的数量为0的提示模板
        documentZeroQuantityTemplates.put("PO", "采购订单明细中存在数量为0的明细，");
        documentZeroQuantityTemplates.put("PI", "采购入库单明细中存在数量为0的明细，");
        documentZeroQuantityTemplates.put("MO", "材料出库单明细中存在数量为0的明细，");
        documentZeroQuantityTemplates.put("FPI", "产成品入库单明细中存在数量为0的明细，");
        documentZeroQuantityTemplates.put("SO", "销售出库单明细中存在数量为0的明细，");
        documentZeroQuantityTemplates.put("OI", "其他入库单明细中存在数量为0的明细，");
        documentZeroQuantityTemplates.put("OO", "其他出库单明细中存在数量为0的明细，");
        documentZeroQuantityTemplates.put("TO", "转库单明细中存在数量为0的明细，");

        // 根据单据类型获取对应的模板
        return documentZeroQuantityTemplates.getOrDefault(documentType, "单据明细中存在数量为0的明细，");
    }

    // ==========================================================
    // 模块名称: 单据WMS库存新增或扣减失败提醒模块
    // 功能描述: 根据不同的消息模式返回不同的提示信息
    // ==========================================================

    /**
     * 单据WMS库存新增或扣减失败的提示
     *
     * @param documentType 单据类型
     * @return 提示信息
     */
    public String updateDocumentWmsFailureMessage(String documentType) {
        // 获取默认消息模式
        String mode = Convert.toStr(redisCache.getCacheObject("sys_config:sys.message.type"));

        // 定义消息模式和对应的消息模板
        Map<String, String> messageTemplates = new HashMap<>();

        // 获取单据类型的WMS库存新增或扣减失败的提示模板
        String documentTemplate = getDocumentWmsFailureTemplate(documentType);

        // 定义不同消息模式的模板
        messageTemplates.put("standard", documentTemplate + "请稍后再试或联系技术支持哦~");
        messageTemplates.put("humorous", "哎呀，" + documentTemplate + "库存操作好像出了点小问题，再试试吧！");

        // 返回生成的消息
        return messageTemplates.getOrDefault(mode, messageTemplates.get("standard"));
    }

    /**
     * 获取不同单据类型的WMS库存新增或扣减失败的提示模板
     *
     * @param documentType 单据类型
     * @return 提示语
     */
    private static String getDocumentWmsFailureTemplate(String documentType) {
        Map<String, String> documentWmsFailureTemplates = new HashMap<>();

        // 定义不同单据类型的WMS库存新增或扣减失败的提示模板
        documentWmsFailureTemplates.put("PO", "NCC系统中采购订单签字成功，但WMS系统库存新增失败，");
        documentWmsFailureTemplates.put("PI", "NCC系统中采购入库单签字成功，但WMS系统库存新增失败，");
        documentWmsFailureTemplates.put("MO", "NCC系统中材料出库单签字成功，但WMS系统库存扣减失败，");
        documentWmsFailureTemplates.put("FPI", "NCC系统中产成品入库单签字成功，但WMS系统库存新增失败，");
        documentWmsFailureTemplates.put("SO", "NCC系统中销售出库单签字成功，但WMS系统库存扣减失败，");
        documentWmsFailureTemplates.put("OI", "NCC系统中其他入库单签字成功，但WMS系统库存新增失败，");
        documentWmsFailureTemplates.put("OO", "NCC系统中其他出库单签字成功，但WMS系统库存扣减失败，");
        documentWmsFailureTemplates.put("TO", "NCC系统中转库单签字成功，但WMS系统库存扣减失败，");

        // 根据单据类型获取对应的模板
        return documentWmsFailureTemplates.getOrDefault(documentType, "单据签字成功，但WMS系统库存操作失败，");
    }

    // ==========================================================
    // 模块名称: 单据WMS单据表头(明细)新增(修改)提醒模块
    // 功能描述: 根据不同的消息模式返回不同的提示信息
    // ==========================================================

    /**
     * 单据WMS单据表头(明细)新增(修改)提醒
     *
     * @param vbillcodeList 单据编码列表
     * @param documentType  单据类型
     * @param operationType 操作类型
     * @param typeName      新增或修改
     * @return 提示信息
     */
    public String documentFailureMessage(List<?> vbillcodeList, String documentType, String operationType, String typeName) {
        // 获取默认消息模式
        String mode = Convert.toStr(redisCache.getCacheObject("sys_config:sys.message.type"));

        // 获取单据类型和操作类型的表头修改失败的提示模板
        String documentTemplate = getDocumentHeaderFailureTemplate(documentType);

        // 获取消息模板
        Map<String, String> messageTemplates = getMessageTemplates(documentTemplate);

        // 获取消息模板，若不存在则返回默认消息模板
        String defaultTemplate = messageTemplates.getOrDefault(mode, messageTemplates.get("standard"));

        // 格式化单号列表并返回最终的消息
        return String.format(defaultTemplate, operationType, typeName, formatBillCodes(vbillcodeList));
    }

    /**
     * 获取不同单据类型的表头修改失败的提示模板
     *
     * @param documentType 单据类型
     * @return 提示语
     */
    private static String getDocumentHeaderFailureTemplate(String documentType) {
        // 定义不同单据类型的表头修改失败提示模板
        Map<String, String> documentHeaderFailureTemplates = new HashMap<>();

        documentHeaderFailureTemplates.put("PO", "采购订单%s%s失败，单号：%s");
        documentHeaderFailureTemplates.put("PI", "采购入库单%s%s失败，单号：%s");
        documentHeaderFailureTemplates.put("MO", "材料出库单%s%s失败，单号：%s");
        documentHeaderFailureTemplates.put("FPI", "产成品入库单%s%s失败，单号：%s");
        documentHeaderFailureTemplates.put("SO", "销售出库单%s%s失败，单号：%s");
        documentHeaderFailureTemplates.put("OI", "其他入库单%s%s失败，单号：%s");
        documentHeaderFailureTemplates.put("OO", "其他出库单%s%s失败，单号：%s");
        documentHeaderFailureTemplates.put("TO", "转库单%s%s失败，单号：%s");

        // 根据单据类型获取对应的模板
        return documentHeaderFailureTemplates.getOrDefault(documentType, "单据%s%s失败，单号：%s");
    }

    /**
     * 获取不同消息模式的模板
     *
     * @param documentTemplate 单据修改失败模板
     * @return 消息模板
     */
    private Map<String, String> getMessageTemplates(String documentTemplate) {
        Map<String, String> messageTemplates = new HashMap<>();

        // 定义不同消息模式的模板
        messageTemplates.put("standard", documentTemplate);
        messageTemplates.put("humorous", String.format("哎呀，%s好像出了点小问题，再试试吧！", documentTemplate));

        return messageTemplates;
    }

    // ==========================================================
    // 模块名称: 成功列表为空时提醒
    // 功能描述: 根据不同的消息模式返回不同的提示信息
    // ==========================================================

    /**
     * 根据单据类型和消息模式生成相应的完成提示消息
     *
     * @param documentType 单据类型
     * @return 提示消息
     */
    public String generateWmsCompletionMessage(String documentType) {
        // 获取当前消息模式配置
        String mode = Convert.toStr(redisCache.getCacheObject("sys_config:sys.message.type"), "standard");

        // 定义消息模式和对应的消息模板
        Map<String, String> messageTemplates = new HashMap<>();

        if (documentType == null || documentType.isEmpty()) {
            documentType = "单据";
        }
        // 定义不同消息模式的模板
        messageTemplates.put("standard", documentType + "已全部完成，无需再次操作。");
        messageTemplates.put("humorous", "所选" + documentType + "已处理完毕，无需重复操作！您的效率简直无人能敌！");


        // 返回生成的消息
        return messageTemplates.getOrDefault(mode, messageTemplates.get("standard"));
    }

    // ==========================================================
    // 模块名称: 请验模块提示语
    // 功能描述: 根据不同的消息模式返回不同的提示信息
    // ==========================================================

    /**
     * 根据模式生成特定场景的提示语
     *
     * @param billStatus 单据状态
     * @return 提示信息
     */
    public AjaxResult qmsBillMessage(String billStatus) {
        // 获取当前消息模式配置
        String mode = Convert.toStr(redisCache.getCacheObject("sys_config:sys.message.type"), "standard");

        // 定义提示信息模板映射表，按模式区分
        Map<String, Map<String, String>> modeMessages = new HashMap<>();

        // 标准模式提示信息
        Map<String, String> standardMessages = new HashMap<>();
        standardMessages.put(BillStatusConstant.OPERATED_CODE, "提示：单据已被PDA提取，请立即登录PDA完成后续操作，确保流程顺畅。");
        standardMessages.put(BillStatusConstant.INSPECTION_CODE, "提示：您的单据已发起请验，重复发起可能影响流程，请耐心等待。");
        standardMessages.put(BillStatusConstant.DELETED_CODE, "提示：单据已被作废，无法再次发起请验，请确认操作是否正确。");
        standardMessages.put(BillStatusConstant.FINISHED_CODE, "提示：单据尚未完成所有签字流程，请检查后再尝试发起请验。");
        standardMessages.put(BillStatusConstant.NOT_OPERATED_CODE, "提示：单据尚未进行任何操作，请检查后再尝试发起请验。");

        // 幽默模式提示信息
        Map<String, String> humorousMessages = new HashMap<>();
        humorousMessages.put(BillStatusConstant.OPERATED_CODE, "嘿！单据已经被PDA拐走啦~ 快去把它‘救’回来吧！");
        humorousMessages.put(BillStatusConstant.INSPECTION_CODE, "哎呀，单据已经发起请验啦，不能再重复操作了，它可是‘很认真’的！");
        humorousMessages.put(BillStatusConstant.DELETED_CODE, "哈哈，单据已经被作废了，它都不知道还能再作废一次！");
        humorousMessages.put(BillStatusConstant.FINISHED_CODE, "喂！单据还有签字没完成，别急，稳住我们能赢！");
        humorousMessages.put(BillStatusConstant.NOT_OPERATED_CODE, "嘿嘿，单据还没开始操作呢！别偷懒哦，快动手吧！");

        // 添加不同模式的提示信息
        modeMessages.put("standard", standardMessages);
        modeMessages.put("humorous", humorousMessages);

        // 获取当前模式的提示信息
        Map<String, String> statusMessages = modeMessages.getOrDefault(mode, standardMessages);

        if (BillStatusConstant.SIGNED_CODE.equals(billStatus)) {
            return AjaxResult.success();
        }

        // 根据单据状态获取对应提示信息
        String messageTemplate = statusMessages.get(billStatus);
        if (messageTemplate != null) {
            return AjaxResult.warn(messageTemplate);
        }

        // 默认处理未知状态
        return AjaxResult.error("提示：未知的单据状态，请检查单据状态！");
    }

    /**
     * 根据模式生成特定场景的提示语
     *
     * @param billStatus 单据状态
     * @return 提示信息
     */
    public AjaxResult qmsBillDetail(String billStatus) {
        // 获取当前消息模式配置
        String mode = Convert.toStr(redisCache.getCacheObject("sys_config:sys.message.type"), "standard");

        // 定义提示信息模板映射表，按模式区分
        Map<String, Map<String, String>> modeMessages = new HashMap<>();

        // 标准模式提示信息
        Map<String, String> standardMessages = new HashMap<>();
        standardMessages.put(BillStatusConstant.OPERATED_CODE, "提示：该条明细已被PDA提取，请立即登录PDA完成后续操作，确保流程顺畅。");
        standardMessages.put(BillStatusConstant.INSPECTION_CODE, "提示：该条明细已发起请验，重复发起可能影响流程，请耐心等待。");
        standardMessages.put(BillStatusConstant.DELETED_CODE, "提示：该条明细已被作废，无法再次发起请验，请确认操作是否正确。");
        standardMessages.put(BillStatusConstant.FINISHED_CODE, "提示：该条明细尚未完成所有签字流程，请检查后再尝试发起请验。");
        standardMessages.put(BillStatusConstant.NOT_OPERATED_CODE, "提示：该条明细尚未进行任何操作，请检查后再尝试发起请验。");

        // 幽默模式提示信息
        Map<String, String> humorousMessages = new HashMap<>();
        humorousMessages.put(BillStatusConstant.OPERATED_CODE, "嘿！该条明细已经被PDA拐走啦~ 快去把它‘救’回来吧！");
        humorousMessages.put(BillStatusConstant.INSPECTION_CODE, "哎呀，该条明细已经发起请验啦，不能再重复操作了，它可是‘很认真’的！");
        humorousMessages.put(BillStatusConstant.DELETED_CODE, "哈哈，该条明细已经被作废了，它都不知道还能再作废一次！");
        humorousMessages.put(BillStatusConstant.FINISHED_CODE, "喂！该条明细还有签字没完成，别急，稳住我们能赢！");
        humorousMessages.put(BillStatusConstant.NOT_OPERATED_CODE, "嘿嘿，该条明细还没开始操作呢！别偷懒哦，快动手吧！");

        // 添加不同模式的提示信息
        modeMessages.put("standard", standardMessages);
        modeMessages.put("humorous", humorousMessages);

        // 获取当前模式的提示信息
        Map<String, String> statusMessages = modeMessages.getOrDefault(mode, standardMessages);

        if (BillStatusConstant.SIGNED_CODE.equals(billStatus)) {
            return AjaxResult.success();
        }

        // 根据单据状态获取对应提示信息
        String messageTemplate = statusMessages.get(billStatus);
        if (messageTemplate != null) {
            return AjaxResult.warn(messageTemplate);
        }

        // 默认处理未知状态
        return AjaxResult.error("提示：未知的单据状态，请检查单据状态！");
    }


    /**
     * 格式化单号列表为字符串
     *
     * @param vbillcodeList 单号列表
     * @return 格式化后的单号字符串
     */
    private static String formatBillCodes(List<?> vbillcodeList) {
        // 使用流的方式将单号列表转换为以逗号分隔的字符串
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < vbillcodeList.size(); i++) {
            sb.append(vbillcodeList.get(i).toString());
            if (i < vbillcodeList.size() - 1) {
                sb.append(", ");
            }
        }
        return sb.toString();
    }
}
